FIT2-2025b 第04回 簡単なゲーム
前回授業の復習
B-7-4、何が課題を難しくしているか?
https://gyazo.com/34ab7e59305e636c88e7367ad0f72193
意訳
スペースキーをボタンを押すたびにモードが切り替わる
編集モード … 編集モード開始直後のマウス座標を始点とし、終点がマウスに合わせてぐりぐり動く
閲覧モード … 編集モード終了時点の状態が固定される
この「状態遷移」を全て「1つのupdate関数、draw関数」にまとめる必要がある
構造化して以下のように整理するとわかりやすい
code:python
import pyxel
pyxel.init(200, 200)
pyxel.mouse(True)
start_x = 0
start_y = 0
end_x = 0
end_y = 0
mode = 'PREVIEW' # モード、を定義、previewで始まる
def update():
global start_x, start_y, end_x, end_y, mode
# スペースキーを押すとモードがPREVIEW/EDITで切り替わる
if pyxel.btnp(pyxel.KEY_SPACE):
if mode == 'PREVIEW':
mode = 'EDIT'
else:
mode = 'PREVIEW'
# previewモードはなにもしない
if mode == 'PREVIEW':
pass
if mode == 'EDIT':
# モード開始直後のマウス座標を始点とする
if pyxel.btnp(pyxel.KEY_SPACE):
start_x = pyxel.mouse_x
start_y = pyxel.mouse_y
# 終点はEDITモードであるかぎり常にマウス座標に更新される
end_x = pyxel.mouse_x
end_y = pyxel.mouse_y
def draw():
global start_x, start_y, end_x, end_y, mode
pyxel.cls(7)
pyxel.line(start_x, start_y, end_x, end_y, 0)
pyxel.run(update, draw)
大事な要素3つ
[- 1. global x,y gobal宣言について]
2 . x = pyxel.mouse_x / pyxel.btn() マウス入力、キー入力
3. pyxel.run() イベントループについて
1. global x,y gobal宣言について
global x,yのコードを削るとエラーになります
理由は以下2つが別物として内部で解釈されるため
インデントの最上位で定義された変数(global変数)
def update (=関数の中)で定義された変数
why: コードが膨大になると関数を多用する => 関数同士で名前衝突が多発するため
2 pyxel.btn キー入力
pyxel.btn … 「キーを押している間ずっとtrueになる」
pyxel.btnp … 「キーを押した瞬間だけtrueになる」 (btnrは「離した瞬間だけ」)
def updateは1/30秒ごとに繰り返し実行されていることに留意
pyxel.btnを利用していると…
ユーザーが実際にスペースを一瞬押しただけのつもりでも、2/30秒以上押してしまうと「2回処理が発生」してしまう
例えば…ボールの向き反転のコード
3. pyxel.run について(=イベントループ)
ゲームの動きをなめらかに実現するための考え方
以下コードでもアニメーションは実現できるが、計算が終わり次第描画されるため「PCが重いとゆっくり動く」「軽いと早く動く」不安定なゲームになってしまう
code:python
import pyxel
pyxel.init(200, 200)
a = 0
while True:
a = a + 1
pyxel.cls(7)
pyxel.circ(a, a, 10, 0)
pyxel.flip()
pyxel.runを利用すれば、update,drawが1/30秒ごとに一定のリズムで実行されるので便利
code:python
import pyxel
a = 0
def update():
global a
a += 1
def draw():
global a
pyxel.circ(a, a, 10, 0)
pyxel.run(update, draw)
本日のゴール
ボールをキャッチする簡単なゲームを作ってもらいます
https://scrapbox.io/files/63587ae062b3ae002254a98c.mov
今回の講義
落ちるボールをキャッチするゲームを作ります!
今週の課題
今回もB-9-1まで必須提出
B-9-2は応用問題 (Sを取りたい方)
次回授業で「リスト」を教わればゲームを作るための主要な技術要素は終わり!
そろそろネタぎめを是非進めましょう
アーケードゲーム、ファミコン〜ゲームボーイアドバンス世代のゲームが非常に参考になる